package middleware

import (
	"bankend/config"
	"log"
	"strings"

	"github.com/gin-gonic/gin"
	"github.com/golang-jwt/jwt/v5"
)

// JWTAuthMiddleware 处理JWT认证的中间件
func JWTAuthMiddleware() gin.HandlerFunc {
	return func(c *gin.Context) {
		// 从请求头获取token
		authHeader := c.GetHeader("Authorization")
		if authHeader == "" {
			log.Printf("JWT: 请求无token，路径: %s", c.Request.URL.Path)
			c.Next() // token为空，直接放行
			return
		}

		// 检查token格式
		parts := strings.SplitN(authHeader, " ", 2)
		if !(len(parts) == 2 && parts[0] == "Bearer") {
			log.Printf("JWT: token格式错误，路径: %s, Authorization: %s", c.Request.URL.Path, authHeader)
			c.Next() // token格式错误，直接放行
			return
		}

		// 解析token
		token := parts[1]
		claims := &jwt.MapClaims{}
		
		// 使用配置文件中的密钥解析token
		parsedToken, err := jwt.ParseWithClaims(token, claims, func(token *jwt.Token) (interface{}, error) {
			return []byte(config.AppConfig.JWTSecret), nil
		})

		if err != nil {
			log.Printf("JWT: token解析失败，路径: %s, 错误: %v", c.Request.URL.Path, err)
			c.Next() // token无效，直接放行
			return
		}

		if !parsedToken.Valid {
			log.Printf("JWT: token无效，路径: %s", c.Request.URL.Path)
			c.Next() // token无效，直接放行
			return
		}

		// token有效，将用户名信息存入上下文
		if username, exists := (*claims)["username"]; exists {
			log.Printf("JWT: token验证成功，用户: %v, 路径: %s", username, c.Request.URL.Path)
			c.Set("username", username)
		} else {
			log.Printf("JWT: token中无用户名信息，路径: %s", c.Request.URL.Path)
		}

		c.Next()
	}
}